import math
import unittest
from unittest.mock import patch

from pyecharts import options as opts
from pyecharts.charts import Surface3D
from pyecharts.faker import Faker


class TestSurface3DChart(unittest.TestCase):
    @patch("pyecharts.render.engine.write_utf8_html_file")
    def test_surface3d_base(self, fake_writer):
        def surface3d_data():
            for t0 in range(-60, 60, 1):
                y = t0 / 60
                for t1 in range(-60, 60, 1):
                    x = t1 / 60
                    if math.fabs(x) < 0.1 and math.fabs(y) < 0.1:
                        z = "-"
                    else:
                        z = math.sin(x * math.pi) * math.sin(y * math.pi)
                    yield [x, y, z]

        c = (
            Surface3D()
            .add(
                "",
                list(surface3d_data()),
                xaxis3d_opts=opts.Axis3DOpts(type_="value"),
                yaxis3d_opts=opts.Axis3DOpts(type_="value"),
                grid3d_opts=opts.Grid3DOpts(width=100, height=100, depth=100),
            )
            .set_global_opts(
                visualmap_opts=opts.VisualMapOpts(
                    max_=3, min_=-3, range_color=Faker.visual_color
                )
            )
        )
        c.render()
        _, content = fake_writer.call_args[0]
        self.assertEqual(c.theme, "white")
        self.assertEqual(c.renderer, "canvas")
